#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
#include <string>
#include <cstring>
#include <vector>
#include <signal.h>
// void *NewThread(void *arg)
// {
//     std::string threadname = (char *)arg;
//     while (true)
//     {
//         std::cout << "I am new thread , My name : " << threadname << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, NewThread, (void *)"thread-1");
//     // 主线程执行之后的代码
//     while (true)
//     {
//         std::cout << "I am main thread" << std::endl;
//         sleep(1);
//     }
//     return 0;
// }
// void* threadrun(void* arg)
// {
//     sleep(1);
//     return (void*)123;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadrun,nullptr);
//     void* ret = nullptr;
//     pthread_join(tid,&ret);
//     std::cout << "new thread retval : " << (long long)ret << std::endl;
// }
// void Print(const sigset_t &s)
// {
//     for (size_t i = 31; i > 0; --i)
//     {
//         if (sigismember(&s, i))
//         {
//             std::cout << "1";
//         }
//         else
//         {
//             std::cout << "0";
//         }
//     }
//     std::cout << std::endl;
// }

// void *running(void *arg)
// {
//     sigset_t s;
//     sleep(1);
//     kill(getpid(),SIGFPE);
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, running, nullptr);
//     sigset_t s;
//     sigfillset(&s);
//     sigprocmask(SIG_SETMASK,&s,nullptr);
//     pthread_join(tid,nullptr);
//     return 0;
// }
// 主线程和新线程block位图不共享
// int g_val = 1;

// void* running(void* arg)
// {
//     while(true)
//     {
//         g_val++;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,running,nullptr);
//     while(true)
//     {
//         std::cout << "g_val : " << g_val << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// void *running(void *arg)
// {
//     while (true)
//     {
//         std::cout << "I am new thread,running...." << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, running, nullptr);
//     void *retval = nullptr;
//     sleep(5);
//     pthread_cancel(tid);
//     pthread_join(tid, &retval);
//     std::cout << "new thread return val :" << (long long)retval << std::endl;
//     return 0;
// }

class Task
{
public:
    Task(int x, int y) : _x(x), _y(y)
    {
    }
    int Execute()
    {
        return _x + _y;
    }

protected:
    int _x;
    int _y;
};
class ThreadDate : public Task
{
public:
    ThreadDate(int x, int y, std::string &name)
        : Task(x, y), _name(name)
    {
    }
    int Execute()
    {
        return Task::Execute();
    }
    std::string name()
    {
        return _name;
    }

protected:
    std::string _name;
};
class Result
{
public:
    Result(int result, std::string name) : _result(result), _name(name)
    {
    }
    int _result;
    std::string _name;
};
void *handler(void *args)
{
    ThreadDate *td = (ThreadDate *)args;
    int retVal = td->Execute();
    Result* r = new Result(retVal,td->name());
    return (void*)r;
}

int main()
{
    std::vector<pthread_t> threads;
    for (size_t i = 0; i < 5; ++i)
    {
        // 主线程创建五个新线程，传入线程名
        pthread_t tid;
        std::string name = "thread-" + std::to_string(i + 1);
        ThreadDate *td = new ThreadDate(10, 20, name);
        int n = pthread_create(&tid, nullptr, handler, (void *)td);
        if (n)
        {
            perror("create thread error!");
            std::cout << "errno:" << n << strerror(n) << std::endl;
            exit(-1);
        }
        threads.push_back(tid);
    }
    std::vector<Result*> val;
    //主线程统一收集线程的执行结果
    for (auto &thread : threads)
    {
        void* ret = nullptr;
        int n =pthread_join(thread, &ret);
        if(n)
        {
            perror("join thread error!");
            std::cout << "errno:" << n << strerror(n) << std::endl;
            exit(1);
        }
        val.push_back((Result*)ret);
    }
    //打印统计好的执行结果
    for(auto& retVal : val)
    {
        std::cout << "thread name : " << retVal->_name << " return val " << retVal->_result << std::endl;
        delete retVal;
    }
    return 0;
}